home *** CD-ROM | disk | FTP | other *** search
/ Spanish Scene 1 / SpanishScene1.iso / spanish pack n°1 by llfb / --llfb-- / programas / sources1.dms / sources1.adf / SOURCES / Scroll / SinusScroll2.ASM < prev    next >
Assembly Source File  |  1996-06-04  |  12KB  |  391 lines

  1. ; =======================================================================
  2.  
  3. ; NOTA de ROMAN SOFT/LLFB: Cuando sustituyo el >EXTERN por un INCBIN e intento
  4. ; ensamblar me da memoria insuficiente (?!?). Sin embargo, usando el >EXTERN
  5. ; se ensambla perfectamente. Así que para ejecutar este source, tienes que
  6. ; hacer lo siguiente (en ASM-One 1.15):
  7. ;
  8. ; >  A    (ensamblar)
  9. ; Pass 1..
  10. ; Pass 2..
  11. ; No Errors
  12. ; >  E    (carga los datos de la font)
  13. ; File length =      1720 (=$0000006B8)
  14. ; No Errors
  15. ; >  J       (run it!)  (Notar que el código está en modo absoluto)
  16.  
  17. ; =======================================================================
  18.  
  19.  
  20. ; ------------ Sinscroller -------------
  21. ; For the CJ Assembler Lesson
  22. ; (c) 1990 Doctor Mabuse
  23. ; the Alpha Flight
  24. ; --------- Important Infos !! ---------
  25. ; As usual get the font calles "data"
  26. ; with the -y- command. As you can see,
  27. ; the routine is preset as a two pixel
  28. ; sinus scroller. It's no problem to
  29. ; change it into a one pixel profi-
  30. ; scroller but beware of the raster.
  31. ; The flickering green shows where the
  32. ; raster line has arrived when the
  33. ; routine has fnished. When it's at the
  34. ; bottom of the screen you have lost.
  35. ; To remove it look for the move in the
  36. ; interrupt.
  37. ; For changing into a 1 or 4 pixel
  38. ; sinus (depending on the available
  39. ; raster time) look for the marked
  40. ; positions in the routine. You must
  41. ; change the blitter mask and at a 
  42. ; second place the shift value of
  43. ; the blitter mask. When you make a
  44. ; One pixel sinus or even with a two
  45. ; pixel one you will notice that the
  46. ; scroller is scrambled at the right
  47. ; end. In this case the routine didn't
  48. ; already finished when the raster line
  49. ; reached this point. To avoid it you
  50. ; must work with double buffering. Make
  51. ; two screens. One for blitting and the
  52. ; other for beeing displayed. Every
  53. ; interupt you swap them, it's very
  54. ; easy. Also you must make a longer
  55. ; sinus wave. The sinus is peridically
  56. ; and you must add another 256 degree
  57. ; turn for the new 160 positions.
  58. ; Try it and good luck!
  59. ;            Yours         DRM
  60. ; ------------- Nachladen --------------
  61.     >Extern "Coleccion_Sources1:Sources/Scroll/sinusscroll2.DAT",$60000,$fffff
  62.     jmp        $50000
  63.     org        $50000
  64.     load        $50000
  65. ; -------------- Offsets ---------------
  66. vbeampos=    -384
  67. openlibrary=     -408
  68. closelibrary=     -414
  69. forbid=     -132
  70. permit=     -138
  71. execbase=     $04
  72. ; --------------------------------------
  73. start:
  74.     movem.l     d0-d7/a0-a6,-(a7)    ; Save registers
  75. ; --------------------------------------
  76. ; ------- Graphics Libary oeffnen ------
  77.     move.l        execbase,a6
  78.     lea        gfxname,a1     
  79.     jsr        openlibrary(a6)
  80.     beq        end
  81.     move.l        d0,gfxbase
  82. ; -------- Prepare Sinus Table ---------
  83.     move.l        #sin,a0
  84. ll:
  85.     move.w        (a0),d1
  86.     muls        #30,d1        ; Amplitude of the sinus wave!!
  87.     asr.l        #8,d1
  88.     muls        #44,d1
  89.     add.l        #$61000+[140*44],d1    ; Middle line of sinus wave
  90.     move.w        d1,(a0)+
  91.     cmp.l        #send,a0
  92.     bne        ll
  93. ; ----------- Clear screen -------------
  94.     move.w        #10,d1
  95. sy:
  96.     move.l        #$60fd0,a0
  97.     move.w        #$1000,d0
  98. sz:
  99.     move.l        #0,(a0)+
  100.     dbra        d0,sz
  101.     dbra        d1,sy
  102. ; --------------------------------------
  103.     move.l        execbase,a6
  104.     jsr        forbid(a6)
  105. ; ---- Eigene Copperliste einsetzen ----
  106.     move.l        gfxbase,a0
  107.     add.l        #$32,a0
  108.     move.w        #$0080,$dff096
  109.     move.l        (a0),oldcopper
  110.     move.l        #newcopper,(a0)
  111.     move.w        #$8080,$dff096
  112. ; --------- Change IRQ vector ----------
  113.     move.l        $6c,oldirq
  114.     move.l        #newirq,$6c
  115. ; ------- Main program Waitloop --------
  116. main:
  117.     btst        #6,$bfe001
  118.     bne        main
  119. ; --------------------------------------
  120.     move.l        oldirq,$6c
  121. ; --------- close GFX-Library ----------
  122.     move.l        execbase,a6
  123.     move.l        gfxbase,a1
  124.     jsr        closelibrary(a6)
  125. ; ----- write old Copperlist back  -----
  126.     move.l        gfxbase,a0
  127.     add.l        #$32,a0
  128.     move.w        #$0080,$dff096
  129.     move.l        oldcopper,(a0)
  130.     move.w        #$8080,$dff096
  131. ; ------ reactiveate Multitasking ------
  132.     move.l        execbase,a6
  133.     jsr        permit(a6)
  134. ; --------------- Exit -----------------
  135.     movem.l        (a7)+,d0-d7/a0-a6
  136. end:
  137.     rts
  138. ; --------------------------------------
  139. ; --------------------------------------
  140. newirq:                    ; Our interrupt
  141.     movem.l        d0-d7/a0-a6,-(sp)    ; Save registers
  142. ; --------------------------------------
  143.     cmp.b        #$7f,$bfec01        ; Check space key
  144.     beq        i0
  145.     bsr        ppppp1
  146. i0:
  147.     bsr        copy
  148.     move.w        #$320,$dff180    ; Set backgroundcolour. Remove
  149.                     ; when you want it. It shows when
  150.                     ; the blitterroutine has
  151.                     ; finished. When this mark comes
  152.                     ; into the area of the sinus
  153.                     ; this will be spoiled. Then you
  154.                     ; must use double buffering.
  155. ; --------------------------------------
  156.     movem.l        (sp)+,d0-d7/a0-a6    ; IRQ End
  157.     dc.w        $4ef9
  158. oldirq:
  159.     dc.l        0
  160. ; --------------------------------------
  161. ppppp1:
  162.     move.l        #$61000,$dff050
  163.     move.l        #$60ffe,$dff054
  164.     move.l        #$00000000,$dff064
  165.     move.l        #$ffff0fff,$dff044
  166.     move.l        #$e9f00000,$dff040
  167.     move.w        #[14*1]*64+$16,$dff058
  168. pend:
  169.     btst        #6,$dff002
  170.     bne.s        pend
  171. ; --------------------------------------
  172.     add.w        #2,srr 
  173.     cmp.w        #18,srr
  174.     bcs.s        no
  175.     move.w        #0,srr
  176.     bsr.s        print1            ; neues zeichen ausgeben
  177. no:
  178.     rts
  179. srr:    dc.w    0
  180. sxx:    dc.l    msg
  181. ; --------------------------------------
  182. print1:
  183.     clr.l        d0
  184.     clr.l        d1
  185.     move.l        sxx,a0
  186.     move.b        (a0),d0
  187.     sub.b        #32,d0
  188.     bpl        nnm
  189.     move.b        #16,d0
  190. nnm:
  191.     move.b        d0,d1
  192.     divu        #20,d1
  193.     move.w        d1,d2
  194.     swap        d1
  195.     move.w        d1,d3
  196.     mulu        #2,d3
  197.     mulu        #14*40,d2
  198.     add.w        d2,d3
  199.     move.l        #$60000,d0
  200.     add.w        d3,d0
  201.     move.l        d0,$dff050
  202.     move.l        #$61028,$dff054        ; Blit Source
  203.     move.l        #$0026002a,$dff064    ; Modulo
  204.     move.l        #$ffffffff,$dff044    ; Maske
  205.     move.l        #$09f00000,$dff040    ; Modus
  206.     move.w        #13*1,d0        ; Hoehe
  207.     asl.w        #6,d0
  208.     add.w        #1,d0            ; Breite
  209.     move.w        d0,$dff058        ; Start
  210. lend:
  211.     btst        #6,$dff002        ; Warten
  212.     bne.s        lend
  213.     add.l        #1,sxx            ; naechstes Zeichen
  214.     cmp.l        #ende,sxx
  215.     bcs        eee
  216.     move.l        #msg,sxx
  217. eee:
  218.     rts
  219. ; ----------- Sinuskopieren ------------
  220. copy:
  221.                         ; Clear sinus area. Take care
  222.     move.l    #$61000+[108*44],$dff054    ; that you clear the right
  223.     move.l    #$00040004,$dff064        ; area. And clear enought but
  224.     move.l    #$0000ffff,$dff044        ; not more than necessary.
  225.     move.l    #$01000000,$dff040
  226.     move.w    #[76*1]*64+$14,$dff058        ; Size of clearing
  227. clend:                        ; Wait
  228.     btst    #6,$dff002
  229.     bne.s    clend
  230. ; --------------------------------------
  231.     add.w        #3,cx            ; This counter lets your sinus
  232.     cmp.w        #256*2,cx        ; wave move with the set speed
  233.     bcs        cno
  234.     move.w        #0,cx
  235. cno:
  236.     move.l        #$61000,d1
  237.     move.l        #$60000,d3
  238.     clr.l        d4
  239.     move.l        #sin,a0
  240.     move.w        cx,d0
  241.     and        #$fffe,d0
  242.     add.w        d0,a0
  243.     move.l        #$002a002a,$dff060    ; Modulo Values for Blitter
  244.     move.l        #$002a002a,$dff064
  245.     move.w        #-1,$dff046        ; Second Mask Word must be filled
  246.  
  247. cn1:                    ; Extern loop: For getting all
  248.                     ; 20 words of one line
  249.     move.w        #$c000,d2    ; Set blit mask. For one (four)
  250.                     ; pixel sinus set to $8000
  251.                     ; ($f000)
  252. cn2:                    ; Intern loop: Copies from your
  253.                     ; word one, two or four bits
  254.                     ; together in 16, 8 or 4 steps.
  255.  
  256.     move.w        (a0),d3        ; Endadress of Sinus List
  257.     add.w        d4,d3
  258.     move.l        d1,$dff050    ; A
  259.     move.l        d3,$dff048    ; C
  260.     move.l        d3,$dff054    ; D
  261.     move.w        d2,$dff044    ; Set Mask
  262.     move.l        #$0b5a0000,$dff040
  263.     move.w        #[13*1]*64+$1,$dff058
  264. cend:
  265.     btst        #6,$dff002
  266.     bne.s        cend
  267.  
  268.     add.w        #2,a0
  269.     lsr        #2,d2        ; Shift Blitter mask left for
  270.                     ; copying the other bits of
  271.                     ; this word. For one (four)
  272.                     ; pixel scroller set to 1 (4)!
  273.     bne        cn2
  274.     add.l        #2,d1
  275.     add.l        #2,d4
  276.     cmp.l        #$28,d4
  277.     bne        cn1
  278.     rts
  279. ; ---------------- Datas ---------------
  280. cx:    dc.w    0
  281. sin:                    ; Sinusnumbers. This sinus table
  282.                     ; has 256 degrees. Important! In
  283.                     ; the Init part a routine 
  284.                     ; multiplicates a values with
  285.                     ; the size of one screen line
  286.                     ; and adds the base adress!!!!
  287.     DC.W    $0100,$0100,$0100,$00FF,$00FF,$00FE,$00FD,$00FC
  288.     DC.W    $00FB,$00FA,$00F8,$00F7,$00F5,$00F3,$00F1,$00EF
  289.     DC.W    $00ED,$00EA,$00E7,$00E5,$00E2,$00DF,$00DC,$00D8
  290.     DC.W    $00D5,$00D1,$00CE,$00CA,$00C6,$00C2,$00BE,$00B9
  291.     DC.W    $00B5,$00B1,$00AC,$00A7,$00A2,$009D,$0098,$0093
  292.     DC.W    $008E,$0089,$0084,$007E,$0079,$0073,$006D,$0068
  293.     DC.W    $0062,$005C,$0056,$0050,$004A,$0044,$003E,$0038
  294.     DC.W    $0032,$002C,$0026,$001F,$0019,$0013,$000D,$0006
  295.     DC.W    $0000,$FFFA,$FFF3,$FFED,$FFE7,$FFE1,$FFDA,$FFD4
  296.     DC.W    $FFCE,$FFC8,$FFC2,$FFBC,$FFB6,$FFB0,$FFAA,$FFA4
  297.     DC.W    $FF9E,$FF98,$FF93,$FF8D,$FF87,$FF82,$FF7C,$FF77
  298.     DC.W    $FF72,$FF6D,$FF67,$FF62,$FF5E,$FF59,$FF54,$FF4F
  299.     DC.W    $FF4B,$FF47,$FF42,$FF3E,$FF3A,$FF36,$FF32,$FF2F
  300.     DC.W    $FF2B,$FF28,$FF24,$FF21,$FF1E,$FF1B,$FF19,$FF16
  301.     DC.W    $FF13,$FF11,$FF0F,$FF0D,$FF0B,$FF09,$FF08,$FF06
  302.     DC.W    $FF05,$FF04,$FF03,$FF02,$FF01,$FF01,$FF00,$FF00
  303.     DC.W    $FF00,$FF00,$FF00,$FF01,$FF01,$FF02,$FF03,$FF04
  304.     DC.W    $FF05,$FF06,$FF08,$FF09,$FF0B,$FF0D,$FF0F,$FF11
  305.     DC.W    $FF13,$FF16,$FF19,$FF1B,$FF1E,$FF21,$FF24,$FF28
  306.     DC.W    $FF2B,$FF2F,$FF32,$FF36,$FF3A,$FF3E,$FF42,$FF47
  307.     DC.W    $FF4B,$FF4F,$FF54,$FF59,$FF5E,$FF63,$FF68,$FF6D
  308.     DC.W    $FF72,$FF77,$FF7C,$FF82,$FF87,$FF8D,$FF93,$FF98
  309.     DC.W    $FF9E,$FFA4,$FFAA,$FFB0,$FFB6,$FFBC,$FFC2,$FFC8
  310.     DC.W    $FFCE,$FFD4,$FFDA,$FFE1,$FFE7,$FFED,$FFF3,$FFFA
  311.     DC.W    $0000,$0006,$000D,$0013,$0019,$001F,$0026,$002C
  312.     DC.W    $0032,$0038,$003E,$0044,$004A,$0050,$0056,$005C
  313.     DC.W    $0062,$0068,$006D,$0073,$0079,$007E,$0084,$0089
  314.     DC.W    $008E,$0093,$0099,$009E,$00A2,$00A7,$00AC,$00B1
  315.     DC.W    $00B5,$00B9,$00BE,$00C2,$00C6,$00CA,$00CE,$00D1
  316.     DC.W    $00D5,$00D8,$00DC,$00DF,$00E2,$00E5,$00E7,$00EA
  317.     DC.W    $00ED,$00EF,$00F1,$00F3,$00F5,$00F7,$00F8,$00FA
  318.     DC.W    $00FB,$00FC,$00FD,$00FE,$00FF,$00FF,$0100,$0100
  319.     DC.W    $0100,$0100,$0100,$00FF,$00FF,$00FE,$00FD,$00FC
  320.     DC.W    $00FB,$00FA,$00F8,$00F7,$00F5,$00F3,$00F1,$00EF
  321.     DC.W    $00ED,$00EA,$00E7,$00E5,$00E2,$00DF,$00DC,$00D8
  322.     DC.W    $00D5,$00D1,$00CE,$00CA,$00C6,$00C2,$00BE,$00B9
  323.     DC.W    $00B5,$00B1,$00AC,$00A7,$00A2,$009D,$0098,$0093
  324.     DC.W    $008E,$0089,$0084,$007E,$0079,$0073,$006D,$0068
  325.     DC.W    $0062,$005C,$0056,$0050,$004A,$0044,$003E,$0038
  326.     DC.W    $0032,$002C,$0026,$001F,$0019,$0013,$000D,$0006
  327.     DC.W    $0000,$FFFA,$FFF3,$FFED,$FFE7,$FFE1,$FFDA,$FFD4
  328.     DC.W    $FFCE,$FFC8,$FFC2,$FFBC,$FFB6,$FFB0,$FFAA,$FFA4
  329.     DC.W    $FF9E,$FF98,$FF93,$FF8D,$FF87,$FF82,$FF7C,$FF77
  330.     DC.W    $FF72,$FF6D,$FF67,$FF62,$FF5E,$FF59,$FF54,$FF4F
  331.     DC.W    $FF4B,$FF47,$FF42,$FF3E,$FF3A,$FF36,$FF32,$FF2F
  332.     DC.W    $FF2B,$FF28,$FF24,$FF21,$FF1E,$FF1B,$FF19,$FF16
  333.     DC.W    $FF13,$FF11,$FF0F,$FF0D,$FF0B,$FF09,$FF08,$FF06
  334.     DC.W    $FF05,$FF04,$FF03,$FF02,$FF01,$FF01,$FF00,$FF00
  335.     DC.W    $FF00,$FF00,$FF00,$FF01,$FF01,$FF02,$FF03,$FF04
  336.     DC.W    $FF05,$FF06,$FF08,$FF09,$FF0B,$FF0D,$FF0F,$FF11
  337.     DC.W    $FF13,$FF16,$FF19,$FF1B,$FF1E,$FF21,$FF24,$FF28
  338.     DC.W    $FF2B,$FF2F,$FF32,$FF36,$FF3A,$FF3E,$FF42,$FF47
  339.     DC.W    $FF4B,$FF4F,$FF54,$FF59,$FF5E,$FF63,$FF68,$FF6D
  340.     DC.W    $FF72,$FF77,$FF7C,$FF82,$FF87,$FF8D,$FF93,$FF98
  341.     DC.W    $FF9E,$FFA4,$FFAA,$FFB0,$FFB6,$FFBC,$FFC2,$FFC8
  342.     DC.W    $FFCE,$FFD4,$FFDA,$FFE1,$FFE7,$FFED,$FFF3,$FFFA
  343.     DC.W    $0000,$0006,$000D,$0013,$0019,$001F,$0026,$002C
  344.     DC.W    $0032,$0038,$003E,$0044,$004A,$0050,$0056,$005C
  345.     DC.W    $0062,$0068,$006D,$0073,$0079,$007E,$0084,$0089
  346.     DC.W    $008E,$0093,$0099,$009E,$00A2,$00A7,$00AC,$00B1
  347.     DC.W    $00B5,$00B9,$00BE,$00C2,$00C6,$00CA,$00CE,$00D1
  348.     DC.W    $00D5,$00D8,$00DC,$00DF,$00E2,$00E5,$00E7,$00EA
  349.     DC.W    $00ED,$00EF,$00F1,$00F3,$00F5,$00F7,$00F8,$00FA
  350.     DC.W    $00FB,$00FC,$00FD,$00FE,$00FF,$00FF,$0100,$0100
  351. send:
  352. ; ------------ Copperliste -------------
  353. newcopper:
  354.     dc.w     $008e,$2881,$0090,$28c1 ; Bildschirmgrenzen 
  355.     dc.w     $0092,$0038,$0094,$00d0 ; DataFetch Start/Stop
  356.     dc.w     $0108,$0004,$010a,$0004    ; Modulos
  357.     dc.w     $0102,$0001,$0104,$0040 ; Control Reg. #1 u. #2
  358.     dc.w     $0100,$2200        ; Control Reg. #0
  359.  
  360.     dc.w    $00e0,$0006,$00e2,$1000-44
  361.     dc.w    $00e4,$0006,$00e6,$1000
  362.  
  363.     dc.w    $0180,$0211,$0182,$0980
  364.     dc.w    $0184,$0ff0,$0186,$0cb0
  365.     dc.w    $0188,$0ddd,$018a,$0bbb
  366.     dc.w    $018c,$0999,$018e,$0866
  367.  
  368.     dc.w    $0120,$0000,$0122,$0000
  369.     dc.w    $0128,$0000,$012a,$0000
  370.     dc.w    $0130,$0000,$0132,$0000
  371.     dc.w    $0138,$0000,$013a,$0000
  372.  
  373.     dc.w    $ffff,$fffe
  374. ; ------------- Scrolltext -------------
  375. msg:
  376.     DC.B    "RS/LLFB IS HERE AGAIN WITH THIS NICE SINE-SCROLLER.  "
  377.     DC.B    "SALUDOS A TODA LA GENTE QUE ESTE APRENDIENDO "
  378.     DC.B    "ENSAMBLADOR Y A LOS DEMAS CODERS DE   S P A I N  !!!    "
  379.     DC.B    "               "
  380. ;    DC.B    "ALPHA FLIGHT PROUDLY PRESENTS ---       "
  381. ;    DC.B    "A MEGA PRODUCTION FROM DOCTOR MABUSE.   "
  382. ;    DC.B    "THE UNBEATABLE CODER  JEAH!!!  .............        "
  383. ende:
  384.     even
  385. ; ---------- Systemregister ------------
  386. gfxbase:    dc.l     0
  387. oldcopper:    dc.l    0
  388. gfxname:
  389.     dc.b     "graphics.library",0,0
  390. ; ------ Pointer der Scrollroutine -----
  391.